package com.qf.file.util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.datamatrix.encoder.ErrorCorrection;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.file.util
 * @Description: 二维码的工具类
 * @Date 2022/8/5 17:19
 */
public class QrCodeUtil {
    /**
     * 生成二维码的方法
     * @param content       二维码的内容
     * @param w                二维码的宽
     * @param h                 二维码的高
     * @param codeColor   二维码的颜色
     * @param bgColor      二维码的背景颜色
     * @return                      生成的二维码图片
     */
    public static BufferedImage qrEncode(String content, int w, int h,int codeColor,int bgColor){
        //实例二维码的属性
        HashMap<EncodeHintType, Object> hint = new HashMap<>();

        //二维码的属性: 内容编码
        hint.put(EncodeHintType.CHARACTER_SET,"UTF-8");

        //二维码的属性: 纠错等级, 这个等级越高, 二维码还原李就越大, 但是二维码也会更密集
        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

        //二维码的属性: 上下左右的边距
        hint.put(EncodeHintType.MARGIN,1);

        //绘制二维码的像素点的信息对象
        BitMatrix bitMatrix = null;

        //保存二维码的结果的图像
        BufferedImage bufferedImage = null;

        try {
            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,w,h,hint);
            //设置二维码的颜色
            MatrixToImageConfig config = new MatrixToImageConfig(codeColor, bgColor);
            //将二维码写入到具体的图片中
            bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix,config );
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return bufferedImage;
    }

    public static void main(String[] args) throws IOException {
        BufferedImage image = qrEncode("四姓家奴詹野种", 200, 200, -16777216, 0xffffffff);
        ImageIO.write(image,"jpg",new File("D:\\詹野种.jpg"));
    }
}
